#!/usr/bin/env python
# -*- coding: utf-8//IGNORE', $string); -*-

'''
@author: Tiago Barriga Nº6048, Belisa Castelhano Nº6303
@obs: Trabalho de Python na disciplina de Linguagens De Programação em 2012/2013
ficheiro que trata da interface da aplicação 
'''

from Tkinter import *
import tkMessageBox
from ReadXls_WriteDB import *
import ReadXls_WriteDB 
from Estatisticas import *
import Tkinter
import matplotlib.pyplot as plt
import os
import tkFileDialog

from sqlalchemy import or_
from sqlalchemy import func

filename = 'Inscritos_2010-2011.xls'
 
anos = [(CriacaoTabelas.Ano95_96, '1995/1996'), (CriacaoTabelas.Ano96_97, '1996/1997'), (CriacaoTabelas.Ano97_98, '1997/1998'),
        (CriacaoTabelas.Ano98_99, '1998/1999'), (CriacaoTabelas.Ano99_00, '1999/2000'), (CriacaoTabelas.Ano00_01, '2000/2001'),
        (CriacaoTabelas.Ano01_02, '2001/2002'), (CriacaoTabelas.Ano02_03, '2002/2003'), (CriacaoTabelas.Ano03_04, '2003/2004'),
        (CriacaoTabelas.Ano04_05, '2004/2005'), (CriacaoTabelas.Ano05_06, '2005/2006'), (CriacaoTabelas.Ano06_07, '2006/2007'),
        (CriacaoTabelas.Ano07_08, '2007/2008'), (CriacaoTabelas.Ano08_09, '2008/2009'), (CriacaoTabelas.Ano09_10, '2009/2010'),
        (CriacaoTabelas.Ano10_11, '2010/2011')]

nivel = [("B - Bacharelato"), ("D - Doutoramento"), ("DE - Diploma de estudos superiores Especializados"),
         ("E - Especialização pós-licenciatura"), ("L - Licenciatura"), ("LT - Licenciatura (parte terminal)"),
          ("M - Mestrado"), ("P - Preparatórios de licenciatura"), ("PB - Bacharelato em ensino + Licenciatura em ensino"),]

class Application(Frame):
    '''
    uma classe tipo Frame responsavel por todo o ambiente grafico
    Frame da biblioteca Tkinter 
    '''


    def __DeleteBD__(self):
        '''
        metodo para apagar a base de dados
        e actualizar a listbox em conformidade
        '''
        accoesbd = ReadXls_WriteDB.AccoesBD
        try:
            accoesbd().__dropBD__()
            tkMessageBox.showinfo("COMPLETO", "A Base de Dados foi Apagada com sucesso!")
        except:
            tkMessageBox.showinfo("Except!", "A Base de Dados já não exite por isso não pode ser apagada")   
        self.destroy()  # destroy e volta a inicializar a janela para poder actualizar a listbox
        self.__init__()
        pass
    

    def __CriarBD__(self):
        '''
        metodo para criar a base de dados a partir do ficheiro .xls
        e actualizar a interface(listbox) em conformidade
        '''
        accoesbd = ReadXls_WriteDB.AccoesBD
        tkMessageBox.showinfo("AGUARDE", "AGUARDE ALGUNS SEGUNDOS. A ESCREVER NA BASE DE DADOS...")
        accoesbd().__create_database__()
        try:
            accoesbd().__insert__()
            tkMessageBox.showinfo("COMPLETO", "OS DADOS FORAM ESCRITOS NA BASE DE DADOS COM SUCESSO!")
        except Exception:
            tkMessageBox.showinfo("Except!", "A Base de Dados já Exsite, e não pode ter tabelas com a mesma chave primaria")
        self.destroy()  # destroy e volta a inicializar a janela para poder actualizar a listbox
        self.__init__()
        pass


    def createWidgets(self):
        '''
        metodo que contem os objetos Tkinter a serem adicionados a Frame
        (butoes, listbox...)
        '''
        # butão para passar o .xls para a base de dados
        self.CriarBD = Button(self)
        self.CriarBD["text"] = ".xls -> Criar Base de Dados"
        self.CriarBD["fg"]   = "blue"
        self.CriarBD["command"] = self.__CriarBD__
        self.CriarBD.config(width = 40, height = 1)
        self.CriarBD.pack()
      
        # butão para apagar a base de dados
        self.apagarBD = Button(self)
        self.apagarBD["text"] = "Apagar Base de Dados"
        self.apagarBD["fg"]   = "red"
        self.apagarBD["command"] = self.__DeleteBD__
        self.apagarBD.config(width = 40, height = 1)  
        #self.apagarBD.pack({"side": "left"})
        self.apagarBD.pack()

        # butão para sair da da janela e fechar o programa
        self.b_sair = Button(self)
        self.b_sair["text"] = "Sair"
        self.b_sair["command"] = quit
        self.b_sair["fg"]   = "red"
        self.b_sair.config(width = 40, height = 1)
        self.b_sair.pack({"side": "bottom"})
        
        # listbox para o utilizador escolher o curso que ver o
        # grafico da 'evelucao' dos launos inscritos ao longo dos anos
        scrollbar = Scrollbar(self)
        scrollbar.pack(side=RIGHT, fill=Y)

        self.labellist = Label(self, text="Duplo-Click no o curso abaixo para ver o Gráfico")
        self.labellist.location(0, 50)
        self.labellist["fg"]="red"
        self.labellist.pack({"side":"top"})
        
        self.lista_cursos = Listbox(self)
        self.lista_cursos["selectmode"] = BROWSE
        self.lista_cursos.config(width = 50, height = 25)
        self.lista_cursos.pack()

        for i in range (0, 776):#total são 11950, a amostra 777 é para ser mais rapido
            if os.path.isfile("BaseDados.db") == True:
                self.lista_cursos.insert( i ,Estatisticas().getCursos(i))
                self.lista_cursos.bind("<Double-Button-1>", self.__fazerGraficos__)
                pass
            pass

        # listbox para o utilizador escolher o nivel de formação e visualizar um grafico
        # da quantidade de alunos inscritos ao longo dos anos
        self.lista_Formacao = Listbox(self)
        self.lista_Formacao["selectmode"] = BROWSE
        self.lista_Formacao.config(width = 50, height = 9)
        self.lista_Formacao.pack()

        for w in range (0, 9):#9 niveis de formação
            if os.path.isfile("BaseDados.db") == True:
                self.lista_Formacao.insert( w , nivel[w])
                self.lista_Formacao.bind("<Double-Button-1>", self.__fazerGraficos_nivelF__)
                pass
            pass

        # listbox para a 4 estatisticas para gravar no .csv
        # em localizaçao a especificar pelo utilizador
        self.labelcsv = Label(self, text="Duplo-Click na estatistica abaixo para gravar em .csv")
        self.labelcsv.location(0, 50)
        self.labelcsv["fg"]= "red"
        self.labelcsv.pack({"side":"top"})
        
        self.lista_sts = Listbox(self)
        self.lista_sts["selectmode"] = SINGLE
        self.lista_sts.config(width = 52, height = 4)
        self.lista_sts.pack()       
        self.lista_sts.insert(0, "Cursos com o termo 'computadores' e/ou 'informática' - informaçoes")
        self.lista_sts.insert(1, "A qt de alunos que nestes se inscreveram ao longo dos anos")
        self.lista_sts.insert(2, "A qt de cursos por nível de formação ao longo dos anos")
        self.lista_sts.insert(3, "A qt de alunos por nível de formação ao longo dos anos")

        self.lista_sts.bind("<Double-Button-1>", self.__to_csv_sts_event__)
        
        pass

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack(side="left",fill="both", expand=True) # para quando não tem a bs criada e tem de a criar antes de voltar a lançar a tk()
        self.createWidgets()
        pass
    

    def __fazerGraficos__(self, event):
        '''
        Graficos y -> alunos inscritos ao longo de x -> anos por curso selecionado
        @param: event -> o numero que vai corresponder ao id do curso
                    embora venha em forma de lista, só se vai usar a primeira possição id[0]
        '''
        id = event.widget.curselection() # valores correspondentes ao item selecionado  
        # ligacao a base de dados 
        AccoesBD.database = create_engine('sqlite:///BaseDados.db', echo = False)
        AccoesBD.login = sessionmaker(bind=AccoesBD.database)
        AccoesBD.login.configure(bind=AccoesBD.database)
        AccoesBD.login = AccoesBD.login()
        inscritos = list()
        titulo = None
        for i in range(anos.__len__()):
            for x in AccoesBD.login.query((anos[i][0]), CriacaoTabelas.id, CriacaoTabelas.Curso_Superior).\
                filter(CriacaoTabelas.id == id[0]):        
                inscritos.insert(i ,Estatisticas().str_int(x[0]))
                titulo = x[2]
                pass
            pass
        #([x][y])
        plt.plot([i for i in range(anos.__len__())],
                 [inscritos[i] for i in range(anos.__len__())])
        
        plt.title(titulo)
        plt.ylabel('Alunos Inscritos')
        plt.xlabel(" Anos ")
        plt.xticks([i for i in range(anos.__len__())],
                   ('95/96','96/97','97/98','98/99','99/00',
                    '00/01','01/02','02/03','03/04','04/05',
                    '05/06','06/07','07/08','08/09','09/10','10/11'))
        plt.show()
        pass

    def __fazerGraficos_nivelF__(self, event):
        '''
        recebe como parematro o evento correspondente ao nivel de formação
        selecionado, e reproduz o seu grafico de inscritos ao longo dos anos
        acedendo a função getFormação do ficehiro Estatisticas.py
        '''
        id = event.widget.curselection() # valores correspondentes ao item selecionado  
        # ligacao a base de dados 
        AccoesBD.database = create_engine('sqlite:///BaseDados.db', echo = False)
        AccoesBD.login = sessionmaker(bind=AccoesBD.database)
        AccoesBD.login.configure(bind=AccoesBD.database)
        AccoesBD.login = AccoesBD.login()
        inscritos = list()
        titulo = nivel[int(id[0])]

        for i in range(anos.__len__()):
            inscritos.insert(i, Estatisticas().getFormacao(i, str(nivel[int(id[0])]) ))
            pass
        #([x][y])
        plt.plot([i for i in range(anos.__len__())],
                 [inscritos[i] for i in range(anos.__len__())])
        
        plt.title(titulo)
        plt.ylabel('Alunos Inscritos')
        plt.xlabel(" Anos ")
        plt.xticks([i for i in range(anos.__len__())],
                   ('95/96','96/97','97/98','98/99','99/00',
                    '00/01','01/02','02/03','03/04','04/05',
                    '05/06','06/07','07/08','08/09','09/10','10/11'))
        plt.show()
        pass
    

    def __to_csv_sts_event__(self, event):
            '''
            @Param event -> recebe o local onde clicou (a posição dentro da listbox)
            trata do do evento da escolha da estatistica para .csv
            conforme o item selecionado
            '''
            n_sts = event.widget.curselection()
            myFormats = [('Windows Bitmap','*.csv'),]
            if  n_sts[0] == '0':
                fileName = tkFileDialog.asksaveasfilename(parent=self, filetypes=myFormats ,title="Onde quer gravar as Estatisticas em .CSV?")
                Estatisticas().__stats__(fileName)
                if os.path.isfile(fileName) == True:
                    tkMessageBox.showinfo("Done!", "Guardado com Sucesso!")
                    pass
                
            elif n_sts[0] == '1':
                fileName = tkFileDialog.asksaveasfilename(parent=self, filetypes=myFormats ,title="Onde quer gravar as Estatisticas em .CSV?")
                Estatisticas().__stats2__(fileName)
                if os.path.isfile(fileName) == True:
                    tkMessageBox.showinfo("Done!", "Guardado com Sucesso!")
                    pass
                    
            elif n_sts[0] == '2':
                fileName = tkFileDialog.asksaveasfilename(parent=self, filetypes=myFormats ,title="Onde quer gravar as Estatisticas em .CSV?")
                Estatisticas().__stats3__(fileName)
                if os.path.isfile(fileName) == True:
                    tkMessageBox.showinfo("Done!", "Guardado com Sucesso!")
                    pass
                    
            elif n_sts[0] == '3':
                fileName = tkFileDialog.asksaveasfilename(parent=self, filetypes=myFormats ,title="Onde quer gravar as Estatisticas em .CSV?")
                Estatisticas().__stats4__(fileName)
                if os.path.isfile(fileName) == True:
                    tkMessageBox.showinfo("Done!", "Guardado com Sucesso!")
                    pass
                pass
                    
            pass
    
    pass


#root = Tk()
#Application(root)
